#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QtConcurrent/QtConcurrent>
#include <QProgressDialog>
#include <QImage>
#include <QDir>
#include <QFileInfo>
#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_processedCount(0)
{
    ui->setupUi(this);
    
    // 初始化进度条
    ui->progressBar->setRange(0, 100);
    ui->progressBar->setValue(0);
    
    // 初始化按钮状态
    ui->processImagesBtn->setEnabled(false);
    
    // 连接信号和槽
    connect(&m_futureWatcher, &QFutureWatcher<void>::finished,
            this, &MainWindow::onProcessingFinished);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_selectImagesBtn_clicked()
{
    // 打开文件选择对话框
    QStringList files = QFileDialog::getOpenFileNames(
        this,
        tr("选择图片"),
        QDir::homePath(),
        tr("图片文件 (*.png *.jpg *.jpeg *.bmp *.gif)")
    );

    if (!files.isEmpty()) {
        m_imagePaths = files;
        ui->imageList->clear();
        ui->imageList->addItems(files);
        ui->processImagesBtn->setEnabled(true);
        
        // 重置进度条
        ui->progressBar->setValue(0);
        m_processedCount = 0;
        
        // 更新状态栏
        statusBar()->showMessage(tr("已选择 %1 张图片").arg(files.size()));
    }
}

void MainWindow::processImage(const QString &imagePath)
{
    // 加载图片
    QImage image(imagePath);
    if (image.isNull()) {
        qWarning("无法加载图片: %s", qPrintable(imagePath));
        return;
    }

    // 转为灰度图
    QImage grayImage = image.convertToFormat(QImage::Format_Grayscale8);

    // 构建输出路径
    QFileInfo fileInfo(imagePath);
    QString outputPath = fileInfo.path() + "/" + fileInfo.baseName() + "_gray." + fileInfo.suffix();

    // 保存处理后的图片
    if (!grayImage.save(outputPath)) {
        qWarning("无法保存处理后的图片: %s", qPrintable(outputPath));
    }
    
    // 更新处理计数
    m_processedCount.fetchAndAddOrdered(1);
    
    // 使用QTimer::singleShot在主线程中更新进度
    QTimer::singleShot(0, this, &MainWindow::updateProgress);
}

void MainWindow::on_processImagesBtn_clicked()
{
    if (m_imagePaths.isEmpty()) {
        QMessageBox::warning(this, tr("警告"), tr("请先选择图片"));
        return;
    }

    // 禁用按钮防止重复操作
    ui->selectImagesBtn->setEnabled(false);
    ui->processImagesBtn->setEnabled(false);
    
    // 重置进度
    m_processedCount = 0;
    ui->progressBar->setValue(0);
    statusBar()->showMessage(tr("正在处理图片..."));

    // 使用QtConcurrent并行处理图片列表
    QFuture<void> future = QtConcurrent::map(m_imagePaths,
                                             [this](const QString &path) {
                                                 this->processImage(path);
                                             });

    // 设置Future
    m_futureWatcher.setFuture(future);
}

void MainWindow::onProcessingFinished()
{
    QMessageBox::information(this, tr("完成"),
                             tr("图片处理完成，已保存到原图片目录"));

    // 恢复按钮状态
    ui->selectImagesBtn->setEnabled(true);
    ui->processImagesBtn->setEnabled(true);
    
    // 更新状态栏
    statusBar()->showMessage(tr("处理完成"));
}

void MainWindow::updateProgress()
{
    if (!m_imagePaths.isEmpty()) {
        int progress = (m_processedCount.loadAcquire() * 100) / m_imagePaths.size();
        ui->progressBar->setValue(progress);
        statusBar()->showMessage(tr("已处理 %1/%2 张图片").arg(m_processedCount.loadAcquire()).arg(m_imagePaths.size()));
    }
}
